<?php
namespace app\controller;

use app\BaseController;
use think\facade\Request;
use think\facade\Db;
use think\Exception;

class AssetTypes extends BaseController
{
    //查询所有资产类型
    public function getAssetTypes()
    {
        $userId = $this->request->auth['data']->user->user_id;

        $current_page = Request::param('current_page');
        $page_size = Request::param('page_size');

        // 根据用户ID获取公司ID
        $companyId = Db::name('user')->where('user_id', $userId)->value('user_company_id');

       //分页查询所有资产类型
        $assetTypes = Db::table('AssetTypes')
            ->where('AssetTypes_company_id', $companyId)
            ->page($current_page, $page_size)
            ->select();


        //获取总条数
        $total = Db::table('AssetTypes')
            ->where('AssetTypes_company_id', $companyId)
            ->count();

        if (!$assetTypes) {
            return json([
                'code' => 400,
                'msg' => '查询失败',
                'data' => []
            ]);
        }

        // 构建树形结构
        $data = $this->buildTree($assetTypes);
        return json([
            'code' => 200,
            'msg' => '查询成功',
            'data' => $data,
            'total' => $total
        ]);
    }

    /**
     * 构建树状结构
     *
     * 通过递归方式，将平铺的数据列表构建为树状结构。
     * 每个节点包含自身的数据，并且可能包含其子节点的数组。
     *
     * @param array $list 平铺式的列表数据，每个元素代表一个节点，应包含父节点ID和自身ID。
     * @param int $parentId 当前遍历层级的父节点ID，默认为0，表示顶层节点。
     * @return array 返回构建好的树状结构数组。
     */
    private function buildTree($list, $parentId = 0)
    {
        $tree = [];
        foreach ($list as $item) {
            if ($item['AssetTypes_parentid'] == $parentId) {
                $children = $this->buildTree($list, $item['AssetTypes_id']);
                if (!empty($children)) {
                    $item['children'] = $children;
                }
                $tree[] = $item;
            }
        }
        return $tree;
    }

    //修改资产类型
    public function updateAssetTypes()
    {
        $userId = $this->request->auth['data']->user->user_id;
        $id=Request::param('id');
        $data=Request::param('data');
        // 根据用户ID获取公司ID
        $companyId = Db::name('user')->where('user_id', $userId)->value('user_company_id');

        //没有包含switch字段说明是修改弹出框
        if (!isset($data['AssetTypes_switch'])) {
            //判断除了当前资产名称外，是否存在相同资产名称
            $role_info = Db::table('AssetTypes')
                ->where('AssetTypes_id', '<>', $id)
                ->where('AssetTypes_name', $data['AssetTypes_name'])
                ->where('AssetTypes_company_id', $companyId)
                ->find();

            if ($role_info) {
                return json([
                    'code' => 400,
                    'msg' => '资产名称已经存在',
                ]);
            }

        }else{
            //说明是swtich开关，需要把所有子层级更新swtich开关
            $Assetsswitch = Db::table('AssetTypes')
                ->where('AssetTypes_company_id', $companyId)
                ->where('AssetTypes_parentid', $id)
                ->update(['AssetTypes_switch' => $data['AssetTypes_switch']]);

            $Assetsswitch1 = Db::table('AssetTypes')
                ->where('AssetTypes_company_id', $companyId)
                ->where('AssetTypes_id', $id)
                ->update(['AssetTypes_switch' => $data['AssetTypes_switch']]);
            if($Assetsswitch || $Assetsswitch1){
                return json([
                    'code' => 200,
                    'msg' => '更新成功'
                ]);
            }else{
                return json([
                    'code' => 500,
                    'msg' => '更新失败'
                ]);
            }

        }

        //没有AssetTypes_parentid字段，说明层级为最高
        if(!isset($data['AssetTypes_parentid'])){
            $data['AssetTypes_parentid'] = 0;
        }
        //根据id修改资产类型,并开启事务
        try {
            Db::startTrans();
            Db::table('AssetTypes')->where('AssetTypes_id', $id)->update($data);
            Db::commit();
            return json([
                'code' => 200,
                'msg' => '修改成功',
                'data' => []
            ]);
        } catch (Exception $e) {
            Db::rollback();
            return json([
                'code' => 400,
                'msg' => '修改失败',
            ]);


            }


    }
    //添加资产类型
    public function addAssetTypes()
    {
        $userId = $this->request->auth['data']->user->user_id;
        $data=Request::param('data');
        $companyId = Db::name('user')->where('user_id', $userId)->value('user_company_id');

        //根据data中的AssetTypes_name查询是否存在相同资产类型，如果存在则提示
        $info = Db::table('AssetTypes')
            ->where('AssetTypes_name', $data['AssetTypes_name'])
            ->where('AssetTypes_company_id', $companyId)
            ->find();
        if ($info) {
            return json([
                'code' => 400,
                'msg' => '资产类型已经存在',
            ]);
        }
        //查询添加的资产类型的AssetTypes_parentid是否有分配资产，如果有，不让添加
        $chickinfo=Db::table('assets')
            ->where('assets_AssetTypes_id', $data['AssetTypes_parentid'])
            ->where('assets_company_id', $companyId)
            ->find();

        if($chickinfo){
            return json([
                'code' => 400,
                'msg' => '新增资产类型父级菜单下有资产，不能添加',
            ]);
        }


        $data['AssetTypes_company_id']=$companyId;
        $data['AssetTypes_level']= $this->calculateAssetTypeLevel($data['AssetTypes_parentid']);
        try {
            Db::startTrans();
            Db::table('AssetTypes')->insert($data);
            Db::commit();
            return json([
                'code' => 200,
                'msg' => '添加成功',
            ]);
        }
        catch (Exception $e) {
            Db::rollback();
            return json([
                'code' => 400,
                'msg' => '添加失败',
            ]);
        }


    }

    /**
     * 计算资产类型的层级
     *
     * @param int $assetTypeId 资产类型ID
     * @return int 层级
     */
    private function calculateAssetTypeLevel($assetTypeId)
    {
        // 检查assetTypeId是否为空或0（通常0不是有效的ID）
        if (empty($assetTypeId) || $assetTypeId === 0) {
            // 如果为空或0，则认为是顶级分类，返回层级1
            return 1;
        }

        // 查询资产类型的父级ID
        $parentId = Db::table('AssetTypes')->where('AssetTypes_id', $assetTypeId)->value('AssetTypes_level');

        // 如果没有，则层级为1那我的层级为2
        if (empty($parentId)) {
            return 2;
        }else{
            return $parentId + 1;
        }


    }

    //删除资产类型
    public function deleteAssetTypes()
    {
        $userId = $this->request->auth['data']->user->user_id;
        $id=Request::param('id');
        // 根据用户ID获取公司ID
        $companyId = Db::name('user')->where('user_id', $userId)->value('user_company_id');

        //根据id查询资产类型是否存在，不存在则提示
        $info = Db::table('AssetTypes')
            ->where('AssetTypes_id', $id)
            ->where('AssetTypes_company_id', $companyId)
            ->find();
        if (!$info) {
            return json([
                'code' => 400,
                'msg' => '资产类型不存在',
            ]);
        }
        //查询是否有子集，如果有不让删除
        $parenin=Db::table('AssetTypes')
                ->where('AssetTypes_parentid', $id)
                ->where('AssetTypes_company_id', $companyId)
                ->find();

        if ($parenin) {
            return json([
                'code' => 500,
                'msg' => '该类型下有子类型，不能删除'
            ]);
        }


        try {
            Db::startTrans();
            Db::table('AssetTypes')->where('AssetTypes_id', $id)->delete();
            Db::commit();
            return json([
                'code' => 200,
                'msg' => '删除成功',
            ]);
        }
        catch (Exception $e) {
            Db::rollback();
            if($e->getCode()==10501)
            {
                return json(['code' => 500, 'msg' => '该分类下已存在单据，无法删除']);
            }
            return json([
                'code' => 400,
                'msg' => '删除失败',
            ]);
        }
        }
}